/*
 * NetRayt
 * Copyright (c) 2007-2008 Maciej Nabozny.
 *
 * NetRayt is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * NetRayt is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with NetRayt; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "serverThread.h"

/*
 * Uruchomienie procesu obsługującego serwer
 * Połączenie sygnałów i slotów
 * Odczytanie listy tekstur z pliku xml
 * Wysłanie żądania ze sceną (później kolejnych
 * po otrzymaniu odpowiedzi)
 */
void serverThread::run() {
	qDebug("serverThread::run: Uruchamiam proces");
	
	// Ustaw wskaźnik zakonczenia procesu na 0. Po otrzymaniu gotowego obrazka bedzie 1
	done = 0;
	
	// Połącz się
	QTcpSocket *c = new QTcpSocket;
	c->connectToHost(info.host, info.port);
	connT = new connThread(c);
	connect(connT, SIGNAL(recResponse(argList, QString)), this, SLOT(getResponse(argList, QString)));
	
	// Wyslij scene:
	sendScene();
}

/*
 * Wysłanie pliku XML
 */
void serverThread::sendScene() {
	argList req;
	req.set("type", "sendscene");
	
	qDebug("serverThread::sendScene: Wysylam zadanie ze scena");
	connT->sendRequest(req, scene);
}

/*
 * Wysłanie pliku z teksturą
 */
void serverThread::sendTex(int num) {
	qDebug("Ktos wywolal sendTex... buuuuuuuuu, niedobry (brak obslugi tekstur)");
}

/*
 * Rozpoczęcie raytracingu na serwerze
 */
void serverThread::readyToRender() {
	argList req;
	
	req.set("type", "startrender");
	if (info.vertical) {
		req.set("y1", "-1");
		req.set("y2", "1");
		
		req.set("x1", QString("%1").arg(info.x1));
		req.set("x2", QString("%1").arg(info.x2));
	} else {
		req.set("y1", "-1");
		req.set("y2", "1");
		
		req.set("x1", QString("%1").arg(info.x1));
		req.set("x2", QString("%1").arg(info.x2));
	}
	
	req.set("raytracer", "yafray");
	qDebug(req.toTag().toAscii());
	connT->sendRequest(req, "");
	qDebug("serverThread::readyToRender: zadanie wyslane do serwera. Oczekiwanie na obrazek");
}

/*
 * Odebranie odpowiedzi od serwera
 */
void serverThread::getResponse(argList list, QString filename) {
	qDebug("serverThread::getResponse: Odebralem odpowiedz");
	// Spradz czy odpowiedz nie zawiera błędu
	if (list.read("msg") != "ok") {
		qDebug(QString("serverThread::getResponse: Blad w odpowiedzi serwera: %1").arg(list.read("msg")).toAscii());
		return;
	}
	
	// Jesli nie bylo bledu, to sprwdź co wykonał serwer i daj mu nowe zadanie
	if (list.read("type") == "sendscene") {
		// Wysłanie pierwszej tekstury
		if (textures.size() != 0) {
			sendTex(0);
		} else {
			readyToRender();
		}
	} else if (list.read("type") == "sendtex") {
		// Wysłanie kolejnych tekstur
		int num = list.read("num").toInt();
		if (num < textures.size()) {
			sendTex(num);
		} else {
			readyToRender();
		}
	} else if (list.read("type") == "sendimage") {
		// Odbierz obrazek
		image = filename;
		done = 1;
		
		emit(ready());
	}
}
